package cn.jimjim.framework.code.generator.common.dao;

import cn.jimjim.framework.code.generator.common.AbstractCriteria;
import cn.jimjim.framework.code.generator.common.Page;
import cn.jimjim.framework.code.generator.common.model.BaseModel;

import java.io.Serializable;
import java.util.List;
import java.util.Set;

/**
 * @author jim
 * @date 2019-03-13
 */
public interface BaseDao<T extends BaseModel> {

    /**
     * 根据主键查询
     *
     * @param id 主键
     * @return model
     */
    T getById(Serializable id);

    /**
     * 查询所有
     *@param criteria 查询条件
     * @return model
     */
    T getByCriteria(AbstractCriteria<T> criteria);

    /**
     * 查询所有
     *
     * @return 所有model
     */
    List<T> list();

    /**
     * 根据criteria查询
     * @param criteria 查询条件
     * @return 所有model
     */
    List<T> listByCriteria(AbstractCriteria<T> criteria);

    /**
     * 分页查询
     *
     * @param criteria  查询条件
     * @return 分页集合
     */
    Page<T> pageByCriteria(AbstractCriteria<T> criteria);

    /**
     * 保存
     * @param model 持久化对象
     */
    void insert(T model);

    /**
     * 批量保存
     *
     * @param models 持久化对象集合
     */
    void batchInsert(List<T> models);

    /**
     * 更新
     *
     * @param model 持久化对象
     */
    void update(T model);

    /**
     * 批量更新
     *
     * @param models 持久化对象集合
     */
    void batchUpdate(List<T> models);

    /**
     * 更新非空字段
     *
     * @param models 持久化对象
     */
    void updateForSelective(T model);

    /**
     * 逻辑删除
     *
     * @param id 主键id
     */
    void softDeleteById(Long id);

    /**
     * 批量逻辑删除
     *
     * @param ids 主键id
     */
    void softDeleteByIds(Set<Long> ids);

    /**
     * 物理删除
     *
     * @param id 主键id
     */
    void hardDeleteById(Long id);

    /**
     * 批量物理删除
     *
     * @param ids 主键id
     */
    void hardDeleteByIds(Set<Long> ids);

}
